package com.wn.common.net

import com.wn.common.net.config.*
import com.wn.common.net.support.LiveDataCallAdapterFactory
import com.wn.common.utils.getBaseHost
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import libcore.net.okhttp.addOkDomain
import okhttp3.Cache
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.io.File
import java.util.concurrent.TimeUnit
import javax.inject.Singleton

/**
 * @Author: wn
 * @Date: 2023/4/12 16:49
 * @Description: 提供 Retrofit 模块
 */
@Module
@InstallIn(SingletonComponent::class)
object RetrofitModule {
  //  提供 OkHttpClient
  @Singleton
  @Provides
  fun provideOkHttpClient(): OkHttpClient =
    OkHttpClient.Builder()
      .addOkDomain(getBaseHost())// 初始化功能，baseurl为初始的主域名地址
      .callTimeout(10, TimeUnit.SECONDS) // 完整请求超时时长，从发起到接收返回数据，默认值0s，不限定
      .connectTimeout(10, TimeUnit.SECONDS) // 与服务器建立连接的时长，默认--10s  秒
      .readTimeout(10, TimeUnit.SECONDS) // 读取服务器返回数据的时长  s
      .writeTimeout(10, TimeUnit.SECONDS) // 向服务器写入数据的时长，默认--10s
      .retryOnConnectionFailure(true) // 重连
      .followRedirects(false)// 重定向
      .cache(Cache(File("data/user/0/com.wn.caiiao/cache", "okHttp"), 1024))// 本地缓存
      .cookieJar(LocalCookieKar())// 本地 cookies 持久化存储
//      .addInterceptor(HostInterceptor()) // BaseUrl 拦截 -- addOkDomain取消拦截
      .addInterceptor(RetryInterceptor(1))// addInterceptor 可以多次拦截
//      .addNetworkInterceptor(RetryInterceptor(1))// 重试  只能拦截一次
      .addNetworkInterceptor(CnInterceptor()) // 公共 header的拦截器
//      .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))// 添加拦截器
      // 添加网络拦截器，可以对okHttp的网络请求做拦截处理，不同于应用拦截器，这里能感知所有网络状态，比如重定向
      .addNetworkInterceptor(HttpLogInterceptor {
        logTag("<wn--Retrofit>")
        logLevel(LogLevel.BODY) // 设置 打印所有
      }).build()

  //  提供  Retrofit.Builder
  @Singleton
  @Provides
  fun provideRetrofitBuilder(): Retrofit.Builder =
    Retrofit.Builder()
      .addConverterFactory(GsonConverterFactory.create())
      .addCallAdapterFactory(LiveDataCallAdapterFactory())

  /**
   * 提供  Retrofit
   * @param retrofitBuilder Builder
   * @param okHttpClient OkHttpClient
   * @return Retrofit
   * 有拦截器  HostInterceptor 替换 baseHost的拦截器
   * 修改 BaseURL  需要 修改 MMKV--SP_KEY_BASE_HOST
   */
  @Singleton
  @Provides
  fun provideRetrofit(retrofitBuilder: Retrofit.Builder, okHttpClient: OkHttpClient): Retrofit =
    retrofitBuilder.baseUrl(getBaseHost()).client(okHttpClient).build()
}